#pragma once
//连接池类（单例版本），用于管理整个服务器的数据库连接

#include "msql_global.h"
#include "MSqlConnection.h"

#include <QQueue>
#include <QMutex>
#include <QMutexLocker>
#include <QSettings>		//配置文件
#include <QWaitCondition>

namespace NsMSql
{
	class MSQL_EXPORT MSqlConnectionPool
	{
	private:
		MSqlConnectionPool();
		//单例对象
		static MSqlConnectionPool& getInstance();
	public:
		~MSqlConnectionPool();
	public:
		//始化连接池初
		static void init(const MDatabaseAttr& databaseAttr);

		//获取数据库连接
		static MSqlConnection getConnection();

		//释放数据库连接回连接池
		static void releaseConnection(MSqlConnection sqlConnection);

		//关闭连接池，删除所有的数据库连接，系统退出时调用
		static void close();
	private:

	private:
		static MSqlConnectionPool* m_pInstance;
		static QMutex m_mutex;
		static QWaitCondition m_waitConnection;

		int m_maxWaitTime;			// 获取连接最大等待时间
		int m_waitInterval;			// 尝试获取连接时等待间隔时间

		QString m_defaultConnectionName;						//默认连接名
		QQueue<QString> m_usedConnectionNames;					// 已使用的数据库连接
		QQueue<QString> m_unusedConnectionNames;				// 未使用的数据库连接
		QMap<QString, MSqlConnection> m_nameConnectionMap;		//<连接名，连接对象>，包括默认连接
	};
}

